package com.example.handler;

import cn.dev33.satoken.stp.StpUtil;
import com.example.constant.BanTypeEnum;
import com.example.model.FraudRiskResult;
import com.example.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 资金异常风险处理器
 * 处理资金异常类型的风险
 * 
 * @author system
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class FinancialAnomalyRiskHandler implements RiskHandler {

  private final UserService userService;

  @Override
  public boolean canHandle(FraudRiskResult result) {
    return result.getRiskType() == 2; // 资金异常类型
  }

  @Override
  public void handle(FraudRiskResult result) {
    if (!canHandle(result)) {
      return;
    }

    log.info("处理资金异常风险，用户地址：{}，风险评分：{}", result.getUserAddress(), result.getScore());

    // 根据风险等级采取不同措施
    switch (result.getRiskLevel()) {
      case 2: // 高风险
        //永久封禁资金操作权限
        StpUtil.disable(result.getUserProfile().getId(), "money", -1);
        userService.banUser(result.getUserProfile().getId(),null, BanTypeEnum.FUND_OPERATION.getCode());
        log.warn("发现高风险资金异常行为，已暂停资金操作权限，用户地址：{}", result.getUserAddress());
        break;
      case 1: // 中风险
        // 限制大额交易
        //封禁资金操作权限一天
//        userService.limitLargeTransactions(result.getUserAddress());
        StpUtil.disable(result.getUserProfile().getId(),"money",86400);
        userService.banUser(result.getUserProfile().getId(), LocalDateTime.now().plusDays(1), BanTypeEnum.FUND_OPERATION.getCode());
        log.warn("发现中风险资金异常行为，已限制大额交易，用户地址：{}", result.getUserAddress());
        break;
      case 0: // 低风险
        // 记录日志，增加监控频率
        log.info("发现低风险资金异常行为，增加监控频率，用户地址：{}", result.getUserAddress());
        break;
      default:
        log.info("未知风险等级，用户地址：{}", result.getUserAddress());
    }
  }

  @Override
  public int getOrder() {
    return 11; // 风险类型处理器优先级低于风险等级处理器，高于地域冲突处理器
  }
}